import unittest
from api.login_api import LoginApi
from common.read_json_data import build_data
from config import BASE_DIR, BODY
from common.db_util import DBUtil
from api.emp_api import EmpApi
from common.verify_result import common_assert
import logging
from parameterized import parameterized


class TestEmp(unittest.TestCase):
    # 定义一个类属性，方法外面，类里面
    mobile = '13300000000'

    @classmethod
    def setUpClass(cls) -> None:
        print('类前置：删除手机号')
        # 1.sql语句，
        # 2.通过数据库工具类，执行sql语句，由于工具类的方法为类方法，需要通过类名调用
        # 删除
        sql = f"delete from bs_user where mobile='{cls.mobile}'"
        n = DBUtil.iud_data(sql)
        print(n)

    @classmethod
    def tearDownClass(cls) -> None:
        print('类后置：删除手机号')
        # 1.sql语句，
        # 2.通过数据库工具类，执行sql语句，由于工具类的方法为类方法，需要通过类名调用
        # 删除
        sql = f"delete from bs_user where mobile='{cls.mobile}'"
        n = DBUtil.iud_data(sql)
        print(n)

    @parameterized.expand(build_data(BASE_DIR + '/data/emp.json'))
    def test_emp(self, case_name, add_body, modify_body, expect_result):
        print('test_emp')
        print(f'case_name = {case_name}')
        add_body['mobile'] = self.mobile
        print(f'add_body = {add_body}')
        print(f'modify_body = {modify_body}')
        print(f'expect_result = {expect_result}')

        # 1.实例化对象
        login_obj = LoginApi()
        # 从配置文件中取登陆的用户信息，请求体
        body = BODY
        # 2.实例化对象调用方法，获取请求头
        au_headers = login_obj.get_au_headers(body)
        # 3.打印获取的内容
        print(f'au_headers = {au_headers}')
        logging.info(f'au_headers = {au_headers}')

        # 0实例化对象
        emp_obj = EmpApi()
        # 新增员工
        # 1.测试数据（手机号唯一）
        # 2.实例对象发送请求，获取响应
        resp = emp_obj.add_emp(add_body, au_headers)
        # 3.打印响应的json格式
        json_data = resp.json()
        print(f'新增员工的结果 = {json_data}')
        logging.info(f'新增员工的结果 = {json_data}')
        # 4.断言 200,True,10000,'成功'
        # self.assertEqual(200, resp.status_code)
        # self.assertEqual(True, json_data['success'])
        # self.assertEqual(10000, json_data['code'])
        # self.assertIn('成功', json_data['message'])
        common_assert(self, expect_result, resp)
        # 5.提取员工id
        emp_id = json_data['data']['id']
        print(f'员工id = {emp_id}')
        logging.info(f'员工id = {emp_id}')

        # 查询员工
        # 1.测试数据(员工id上面已经有了)
        # 2.实例对象发送请求，获取响应
        resp = emp_obj.query_emp(emp_id, au_headers)
        # 3.打印响应的json格式
        json_data = resp.json()
        print(f'查询员工的结果 = {json_data}')
        logging.info(f'查询员工的结果 = {json_data}')
        # 4.断言 200,True,10000,'成功'
        # self.assertEqual(200, resp.status_code)
        # self.assertEqual(True, json_data['success'])
        # self.assertEqual(10000, json_data['code'])
        # self.assertIn('成功', json_data['message'])
        common_assert(self, expect_result, resp)

        # 修改员工
        # 1.测试数据(员工id上面已经有了，修改的body数据)
        # 2.实例对象发送请求，获取响应
        resp = emp_obj.modify_emp(modify_body, emp_id, au_headers)
        # 3.打印响应的json格式
        json_data = resp.json()
        print(f'修改员工的结果 = {json_data}')
        logging.info(f'修改员工的结果 = {json_data}')
        # 4.断言 200,True,10000,'成功'
        # self.assertEqual(200, resp.status_code)
        # self.assertEqual(True, json_data['success'])
        # self.assertEqual(10000, json_data['code'])
        # self.assertIn('成功', json_data['message'])
        common_assert(self, expect_result, resp)

        # 删除员工
        # 1.测试数据数据(员工id上面已经有了)
        # 2.实例对象发送请求，获取响应
        resp = emp_obj.delete_emp(emp_id, au_headers)
        # 3.打印响应的json格式
        json_data = resp.json()
        print(f'删除员工的结果 = {json_data}')
        logging.info(f'删除员工的结果 = {json_data}')
        # 4.断言 200,True,10000,'成功'
        # self.assertEqual(200, resp.status_code)
        # self.assertEqual(True, json_data['success'])
        # self.assertEqual(10000, json_data['code'])
        # self.assertIn('成功', json_data['message'])
        common_assert(self, expect_result, resp)
